# language: zh-CN
# 需求ID: REQ-013
# SRS需求: SRS-013 RSQL查询语言支持
# Feature ID: F-013
# 用户故事: US-038, US-039, US-040, US-041
功能: RSQL查询支持
  作为最终用户
  我希望能使用简单的RSQL语法进行数据查询
  以便无需学习复杂的SQL

  背景:
    假设我是一个最终用户
    并且我需要查询数据
    并且我不熟悉复杂的SQL语法
    并且系统已经定义了用户和订单实体

  # US-038: 作为最终用户，我希望能够使用简单的RSQL语法进行基础查询，以便快速获取所需数据
  场景: 基础比较查询
    假设我需要查询特定条件的用户
    当我使用RSQL语法进行查询:
      | RSQL查询                    | 描述           |
      | name=="John Doe"            | 精确匹配姓名   |
      | age>25                      | 年龄大于25     |
      | age>=18                     | 年龄大于等于18 |
      | age<65                      | 年龄小于65     |
      | age<=30                     | 年龄小于等于30 |
      | status!="inactive"          | 状态不等于inactive |
    那么系统应该生成相应的SQL查询
    并且应该返回符合条件的用户列表
    并且应该使用参数化查询防止SQL注入

  场景: 集合查询操作
    假设我需要使用集合操作查询数据
    当我使用RSQL集合语法:
      | RSQL查询                           | 描述                    |
      | status=in=("active","pending")     | 状态在指定值列表中      |
      | status=out=("inactive","banned")   | 状态不在指定值列表中    |
      | age=in=(18,25,30)                  | 年龄在指定数值列表中    |
      | name=in=("John","Jane","Bob")      | 姓名在指定字符串列表中  |
    那么系统应该生成包含IN或NOT IN的SQL查询
    并且应该正确处理不同数据类型的集合
    并且应该优化大集合的查询性能

  场景: 模糊匹配查询
    假设我需要进行模糊搜索
    当我使用RSQL模糊匹配语法:
      | RSQL查询                    | 描述                 |
      | name==*John*                | 姓名包含John         |
      | name==John*                 | 姓名以John开头       |
      | name==*Doe                  | 姓名以Doe结尾        |
      | email==*@gmail.com          | 邮箱以@gmail.com结尾 |
      | description==*keyword*      | 描述包含关键词       |
    那么系统应该生成LIKE查询
    并且应该正确转义特殊字符
    并且应该支持大小写不敏感的匹配
    并且应该优化模糊查询的性能

  # US-039: 作为最终用户，我希望能够使用RSQL进行复杂的逻辑组合查询，以便满足多样化的查询需求
  场景: 逻辑组合查询
    假设我需要组合多个查询条件
    当我使用RSQL逻辑操作符:
      | RSQL查询                                        | 描述                      |
      | name=="John" and age>25                        | AND逻辑组合               |
      | status=="active" or status=="pending"          | OR逻辑组合                |
      | (name=="John" or name=="Jane") and age>18      | 括号分组优先级            |
      | name=="John" and (age>25 or status=="vip")     | 复杂逻辑组合              |
      | not (status=="inactive" or status=="banned")   | NOT逻辑否定               |
    那么系统应该正确解析逻辑操作符
    并且应该处理操作符优先级
    并且应该支持括号分组
    并且应该生成优化的SQL WHERE子句

  # US-040: 作为最终用户，我希望能够通过RSQL查询关联实体数据，以便获取完整的业务信息
  场景: 关联路径查询
    假设我需要查询关联实体的数据
    当我使用RSQL关联路径语法:
      | RSQL查询                              | 描述                    |
      | orders.status=="completed"            | 查询有已完成订单的用户  |
      | orders.amount>1000                    | 查询有高价值订单的用户  |
      | orders.items.product.name=="iPhone"   | 查询购买了iPhone的用户  |
      | profile.address.city=="Beijing"       | 查询北京用户            |
      | orders.createdAt>"2024-01-01"         | 查询2024年后有订单的用户|
    那么系统应该自动生成JOIN查询
    并且应该优化多层关联的查询性能
    并且应该处理关联实体不存在的情况
    并且应该支持一对多和多对一关联

  场景: 日期和时间查询
    假设我需要查询时间相关的数据
    当我使用RSQL日期时间语法:
      | RSQL查询                                    | 描述                    |
      | createdAt>"2024-01-01"                     | 创建时间晚于指定日期    |
      | createdAt<"2024-12-31T23:59:59Z"           | 创建时间早于指定时间    |
      | updatedAt=ge="2024-01-01T00:00:00Z"        | 更新时间大于等于指定时间|
      | createdAt=in=("2024-01-01","2024-01-02")  | 创建时间在指定日期列表中|
    那么系统应该正确解析日期时间格式
    并且应该支持多种日期时间格式
    并且应该处理时区转换
    并且应该优化日期范围查询

  场景: 数值范围查询
    假设我需要查询数值范围
    当我使用RSQL数值范围语法:
      | RSQL查询                        | 描述                |
      | age=ge=18 and age=le=65         | 年龄在18到65之间    |
      | price>100 and price<1000        | 价格在100到1000之间 |
      | score=in=(80,90,100)            | 分数在指定值列表中  |
      | rating>=4.0                     | 评分大于等于4.0     |
    那么系统应该生成范围查询
    并且应该优化范围查询性能
    并且应该支持不同数值类型
    并且应该处理边界值情况

  场景: 查询结果排序
    假设我需要对查询结果排序
    当我在RSQL查询中指定排序:
      | RSQL查询 + 排序                           | 描述                    |
      | name=="John*" sort by createdAt asc       | 按创建时间升序排序      |
      | age>25 sort by age desc, name asc         | 多字段排序              |
      | status=="active" sort by orders.amount desc | 按关联字段排序          |
    那么系统应该在SQL中添加ORDER BY子句
    并且应该支持多字段排序
    并且应该支持关联字段排序
    并且应该优化排序性能

  # US-041: 作为最终用户，我希望RSQL查询具有良好的性能和错误处理，以便获得流畅的使用体验
  场景: 查询性能优化
    假设我执行复杂的RSQL查询
    当系统处理查询时
    那么应该分析查询复杂度
    并且应该自动选择最优的执行计划
    并且应该使用索引优化查询
    并且应该缓存频繁使用的查询结果
    并且应该提供查询性能分析报告
    并且应该在查询超时时提供优化建议

  场景: RSQL语法错误处理
    假设我编写了错误的RSQL语法
    当我使用以下错误语法:
      | 错误的RSQL语法              | 错误类型        |
      | name="John                  | 引号不匹配      |
      | age>>25                     | 操作符错误      |
      | (name=="John" and age>25    | 括号不匹配      |
      | unknownField=="value"       | 字段不存在      |
      | name=invalidOperator="John" | 操作符不支持    |
    那么系统应该返回语法错误信息
    并且应该指出错误位置
    并且应该提供修正建议
    并且应该提供语法帮助文档